package 矩阵

/*
https://leetcode.cn/problems/spiral-matrix/?envType=study-plan-v2&envId=top-100-liked

54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。

示例 1：
输入：matrix = [
	[1,2,3],
	[4,5,6],
	[7,8,9]
]

输出：[1,2,3,6,9,8,7,4,5]

示例 2：
输入：matrix = [
	[1,2,3,4],
	[5,6,7,8],
	[9,10,11,12]
]

输出：[1,2,3,4,8,12,11,10,9,5,6,7]
*/

func spiralOrder(matrix [][]int) []int {
	if len(matrix) == 0 || len(matrix[0]) == 0 {
		return []int{}
	}

	var (
		rows, columns            = len(matrix), len(matrix[0]) //行长度, 列长度
		order                    = make([]int, rows*columns)   //结果数组
		index                    = 0                           //在结果数组中的下标
		left, right, top, bottom = 0, columns - 1, 0, rows - 1 //上下左右边界
	)

	//只要范围不越界, 持续遍历
	for left <= right && top <= bottom {
		for column := left; column <= right; column++ { //列从左出发,小于等于有边界, 不断右移
			order[index] = matrix[top][column] //放入结果数组
			index++                            //结果数组下标++
		}
		for row := top + 1; row <= bottom; row++ { //由于第一行已经被遍历了, 需要从下一行开始(top+1),
			order[index] = matrix[row][right] //加入结果数组
			index++
		}

		if left < right && top < bottom { //向左和向上向回遍历时, 需要加上边界条件(例如已经到中心点了, 不需要向回走了)
			for column := right - 1; column > left; column-- {
				order[index] = matrix[bottom][column]
				index++
			}
			for row := bottom; row > top; row-- {
				order[index] = matrix[row][left]
				index++
			}
		}
		left++ //左边界++ 右边界-- 上边界++ 底边界--
		right--
		top++
		bottom--
	}
	return order
}
